home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 12 The Geometry Shader / TreeBillboards / Shaders / Default.hlsl next >
Text File  |  2016-03-02  |  4KB  |  157 lines

  1. //***************************************************************************************
  2. // Default.hlsl by Frank Luna (C) 2015 All Rights Reserved.
  3. //
  4. // Default shader, currently supports lighting.
  5. //***************************************************************************************
  6.  
  7. // Defaults for number of lights.
  8. #ifndef NUM_DIR_LIGHTS
  9.     #define NUM_DIR_LIGHTS 3
  10. #endif
  11.  
  12. #ifndef NUM_POINT_LIGHTS
  13.     #define NUM_POINT_LIGHTS 0
  14. #endif
  15.  
  16. #ifndef NUM_SPOT_LIGHTS
  17.     #define NUM_SPOT_LIGHTS 0
  18. #endif
  19.  
  20. // Include structures and functions for lighting.
  21. #include "LightingUtil.hlsl"
  22.  
  23. Texture2D    gDiffuseMap : register(t0);
  24.  
  25.  
  26. SamplerState gsamPointWrap        : register(s0);
  27. SamplerState gsamPointClamp       : register(s1);
  28. SamplerState gsamLinearWrap       : register(s2);
  29. SamplerState gsamLinearClamp      : register(s3);
  30. SamplerState gsamAnisotropicWrap  : register(s4);
  31. SamplerState gsamAnisotropicClamp : register(s5);
  32.  
  33. // Constant data that varies per frame.
  34. cbuffer cbPerObject : register(b0)
  35. {
  36.     float4x4 gWorld;
  37.     float4x4 gTexTransform;
  38. };
  39.  
  40. // Constant data that varies per material.
  41. cbuffer cbPass : register(b1)
  42. {
  43.     float4x4 gView;
  44.     float4x4 gInvView;
  45.     float4x4 gProj;
  46.     float4x4 gInvProj;
  47.     float4x4 gViewProj;
  48.     float4x4 gInvViewProj;
  49.     float3 gEyePosW;
  50.     float cbPerObjectPad1;
  51.     float2 gRenderTargetSize;
  52.     float2 gInvRenderTargetSize;
  53.     float gNearZ;
  54.     float gFarZ;
  55.     float gTotalTime;
  56.     float gDeltaTime;
  57.     float4 gAmbientLight;
  58.  
  59.     float4 gFogColor;
  60.     float gFogStart;
  61.     float gFogRange;
  62.     float2 cbPerObjectPad2;
  63.  
  64.     // Indices [0, NUM_DIR_LIGHTS) are directional lights;
  65.     // indices [NUM_DIR_LIGHTS, NUM_DIR_LIGHTS+NUM_POINT_LIGHTS) are point lights;
  66.     // indices [NUM_DIR_LIGHTS+NUM_POINT_LIGHTS, NUM_DIR_LIGHTS+NUM_POINT_LIGHT+NUM_SPOT_LIGHTS)
  67.     // are spot lights for a maximum of MaxLights per object.
  68.     Light gLights[MaxLights];
  69. };
  70.  
  71. cbuffer cbMaterial : register(b2)
  72. {
  73.     float4   gDiffuseAlbedo;
  74.     float3   gFresnelR0;
  75.     float    gRoughness;
  76.     float4x4 gMatTransform;
  77. };
  78.  
  79. struct VertexIn
  80. {
  81.     float3 PosL    : POSITION;
  82.     float3 NormalL : NORMAL;
  83.     float2 TexC    : TEXCOORD;
  84. };
  85.  
  86. struct VertexOut
  87. {
  88.     float4 PosH    : SV_POSITION;
  89.     float3 PosW    : POSITION;
  90.     float3 NormalW : NORMAL;
  91.     float2 TexC    : TEXCOORD;
  92. };
  93.  
  94. VertexOut VS(VertexIn vin)
  95. {
  96.     VertexOut vout = (VertexOut)0.0f;
  97.     
  98.     // Transform to world space.
  99.     float4 posW = mul(float4(vin.PosL, 1.0f), gWorld);
  100.     vout.PosW = posW.xyz;
  101.  
  102.     // Assumes nonuniform scaling; otherwise, need to use inverse-transpose of world matrix.
  103.     vout.NormalW = mul(vin.NormalL, (float3x3)gWorld);
  104.  
  105.     // Transform to homogeneous clip space.
  106.     vout.PosH = mul(posW, gViewProj);
  107.     
  108.     // Output vertex attributes for interpolation across triangle.
  109.     float4 texC = mul(float4(vin.TexC, 0.0f, 1.0f), gTexTransform);
  110.     vout.TexC = mul(texC, gMatTransform).xy;
  111.  
  112.     return vout;
  113. }
  114.  
  115. float4 PS(VertexOut pin) : SV_Target
  116. {
  117.     float4 diffuseAlbedo = gDiffuseMap.Sample(gsamAnisotropicWrap, pin.TexC) * gDiffuseAlbedo;
  118.     
  119. #ifdef ALPHA_TEST
  120.     // Discard pixel if texture alpha < 0.1.  We do this test as soon 
  121.     // as possible in the shader so that we can potentially exit the
  122.     // shader early, thereby skipping the rest of the shader code.
  123.     clip(diffuseAlbedo.a - 0.1f);
  124. #endif
  125.  
  126.     // Interpolating normal can unnormalize it, so renormalize it.
  127.     pin.NormalW = normalize(pin.NormalW);
  128.  
  129.     // Vector from point being lit to eye. 
  130.     float3 toEyeW = gEyePosW - pin.PosW;
  131.     float distToEye = length(toEyeW);
  132.     toEyeW /= distToEye; // normalize
  133.  
  134.     // Light terms.
  135.     float4 ambient = gAmbientLight*diffuseAlbedo;
  136.  
  137.     const float shininess = 1.0f - gRoughness;
  138.     Material mat = { diffuseAlbedo, gFresnelR0, shininess };
  139.     float3 shadowFactor = 1.0f;
  140.     float4 directLight = ComputeLighting(gLights, mat, pin.PosW,
  141.         pin.NormalW, toEyeW, shadowFactor);
  142.  
  143.     float4 litColor = ambient + directLight;
  144.  
  145. #ifdef FOG
  146.     float fogAmount = saturate((distToEye - gFogStart) / gFogRange);
  147.     litColor = lerp(litColor, gFogColor, fogAmount);
  148. #endif
  149.  
  150.     // Common convention to take alpha from diffuse albedo.
  151.     litColor.a = diffuseAlbedo.a;
  152.  
  153.     return litColor;
  154. }
  155.  
  156.  
  157.